#include "lst_timer.h"
#include <stdlib.h>

// 初始化定时器链表，将头尾指针置为NULL
void sort_timer_lst_init(sort_timer_lst* lst) {
    lst->head = NULL;
    lst->tail = NULL;
}

// 销毁定时器链表，释放所有定时器节点的内存
void sort_timer_lst_destroy(sort_timer_lst* lst) {
    util_timer* tmp = lst->head;
    while (tmp) {
        util_timer* next = tmp->next;
        free(tmp); // 释放当前节点
        tmp = next;
    }
    lst->head = NULL;
    lst->tail = NULL;
}

// 添加定时器到链表，保持链表按超时时间升序排列
void add_timer(sort_timer_lst* lst, util_timer* timer) {
    if (!timer) return; // 空指针保护
    if (!lst->head) { // 链表为空，直接作为头尾节点
        lst->head = lst->tail = timer;
        timer->prev = timer->next = NULL;
        return;
    }
    if (timer->expire < lst->head->expire) { // 比头节点还早，插入头部
        timer->next = lst->head;
        timer->prev = NULL;
        lst->head->prev = timer;
        lst->head = timer;
        return;
    }
    // 在链表中找到合适位置插入
    util_timer* prev = lst->head;
    util_timer* tmp = lst->head->next;
    while (tmp) {
        if (timer->expire < tmp->expire) {
            prev->next = timer;
            timer->next = tmp;
            tmp->prev = timer;
            timer->prev = prev;
            return;
        }
        prev = tmp;
        tmp = tmp->next;
    }
    // 插入到链表尾部
    prev->next = timer;
    timer->prev = prev;
    timer->next = NULL;
    lst->tail = timer;
}

// 调整定时器在链表中的位置（超时时间变化时调用）
void adjust_timer(sort_timer_lst* lst, util_timer* timer) {
    if (!timer) return;
    util_timer* tmp = timer->next;
    // 如果timer已经在合适位置则不动
    if (!tmp || (timer->expire < tmp->expire)) {
        return;
    }
    // 从链表中取出timer
    if (timer == lst->head) {
        lst->head = timer->next;
        if (lst->head) lst->head->prev = NULL;
    } else {
        timer->prev->next = timer->next;
        if (timer->next) timer->next->prev = timer->prev;
    }
    // 重新插入到合适位置
    add_timer(lst, timer);
}

// 从链表中删除定时器，并释放其内存
void del_timer(sort_timer_lst* lst, util_timer* timer) {
    if (!timer) return;
    // 只有一个节点
    if ((timer == lst->head) && (timer == lst->tail)) {
        free(timer);
        lst->head = NULL;
        lst->tail = NULL;
        return;
    }
    // 删除头节点
    if (timer == lst->head) {
        lst->head = timer->next;
        if (lst->head) lst->head->prev = NULL;
        free(timer);
        return;
    }
    // 删除尾节点
    if (timer == lst->tail) {
        lst->tail = timer->prev;
        if (lst->tail) lst->tail->next = NULL;
        free(timer);
        return;
    }
    // 删除中间节点
    timer->prev->next = timer->next;
    if (timer->next) timer->next->prev = timer->prev;
    free(timer);
}

// 定时处理函数，遍历链表处理所有到期的定时器
void tick(sort_timer_lst* lst) {
    if (!lst->head) return;
    printf("timer tick\n");
    time_t cur = time(NULL); // 获取当前时间
    util_timer* tmp = lst->head;
    while (tmp) {
        if (cur < tmp->expire) {
            break; // 未到期，后续节点也未到期
        }
        // 调用定时器的回调函数
        if (tmp->cb_func) {
            tmp->cb_func(tmp->user_data);
        }
        // 删除定时器节点
        lst->head = tmp->next;
        if (lst->head) lst->head->prev = NULL;
        util_timer* to_free = tmp;
        tmp = lst->head;
        free(to_free);
    }
    // 如果链表为空，尾指针也置为NULL
    if (!lst->head) lst->tail = NULL;
}
